home *** CD-ROM | disk | FTP | other *** search
/ Ham Radio 2000 / Ham Radio 2000.iso / ham2000 / misc / dbrain / brain.asm < prev    next >
Assembly Source File  |  1995-07-14  |  25KB  |  1,033 lines

  1. *--------------------------------------------
  2. *    68HC05 Version.                -
  3. *    Craswell Variable Frequency Osc     -
  4. *    Using the Harris 45102 NCO.        -
  5. *--------------------------------------------
  6. *    Dover Research Corporation        -
  7. *    November 2nd 1993, June 30th 1995   -
  8. *    All rights reserved            -
  9. *                        -
  10. * Author: James J. Craswell WB0VNE/AAV5TH   -
  11. * Part of a commercial product so this code -
  12. *      Is NOT Public Domain            -
  13. *         (612) 492-3913            -
  14. *--------------------------------------------
  15. * 1.0 Nano processor Harris controler.        -
  16. *                        -
  17. * BUGS: None?!    (a tiny voice says "yet")   -
  18. *--------------------------------------------
  19. *        THE ETHIC            -
  20. * Promote free exchange of information.     -
  21. * Mistrust Authority.                -
  22. * Promote Decentralization.            -
  23. * Programers should be judged by their work -
  24. * not bogus criteria such as degrees, age,  -
  25. * race or position.                -
  26. * You can create art, beauty and complete   -
  27. * and total crap on a computer.            -
  28. * Computers can change / screw up your life.-
  29. *--------------------------------------------
  30. *    W A T C H      O U T    A S I M O !        -
  31. *--------------------------------------------
  32.  
  33.  
  34.  
  35.     org    $00c0        ;Start of user ram.
  36.  
  37.  
  38.  
  39. *****************************
  40. * Ram locations for different
  41. * routines.
  42. *****************************
  43. vfo4    db    0        ;Always valid current VFO frequency.
  44. vfo3    db    0
  45. vfo2    db    0
  46. vfo1    db    0
  47.  
  48. scr4    db    0        ;Scratch vfo used for math and shifting.
  49. scr3    db    0
  50. scr2    db    0
  51. scr1    db    0
  52.  
  53. math4    db    0        ;msb for math routines and up/dn steps.
  54. math3    db    0        ;As well as display routines
  55. math2    db    0        ;and other neato stuff.
  56. math1    db    0        ;lsb.
  57.  
  58. mathb4    db    0        ;Scratch math area.
  59. mathb3    db    0
  60. mathb2    db    0
  61. mathb1    db    0
  62.  
  63. first    db    0        ;Most receint read on the opto switch.
  64. ans    db    0        ;Answer to dds divide.
  65. tempa    db    0        ;Place to save a register.
  66. tempx    db    0        ;Place to save x regester.
  67.  
  68.  
  69.  
  70. ***************
  71. * LCD MESSAGES:
  72. ***************
  73. mfreq    db    '               '
  74. mstep    db    '               '
  75.  
  76. ***************
  77. * CURRENT STEP:
  78. ***************
  79. cstep    db    0        ; 0-1hz,  1-10hz,  2-100hz
  80.                 ; 3-1KHz, 4-10KHz, 5-100Khz
  81. ***************************
  82. * Zero VFO frequeny in hex.
  83. ***************************
  84. t4    equ    20h        ;msb of test vfo.
  85. t3    equ    51h        ;
  86. t2    equ    0ebh        ;
  87. t1    equ    85h        ;lsb of 5.05MHz.
  88.  
  89. **********************
  90. * HARRIS DDS Commands.
  91. **********************
  92. idle    equ    0b4h        ;This cmd sets the Harris DDS to the Idle state.
  93. xfer    equ    0fbh        ;Clk to Harris DDS.
  94. dat1    equ    0b6h        ;Data bit = 1.
  95. clk    equ    1        ;Clock bit is the 1 bit.
  96. lcnt    equ    1fh        ;Length of all Harris DDS commands.
  97.  
  98. *********************************
  99. * Frequencies in Harris DDS talk.
  100. *********************************
  101. h1-4    equ    0        ;1hertz steps.
  102. h1-3    equ    0
  103. h1-2    equ    0
  104. h1-1    equ    6ch
  105.  
  106. h10-4    equ    0        ;10hz.
  107. h10-3    equ    0
  108. h10-2    equ    4h
  109. h10-1    equ    32h
  110.  
  111. h100-4    equ    0        ;100hz.
  112. h100-3    equ    0
  113. h100-2    equ    29h
  114. h100-1    equ    0f2h
  115.  
  116. k1-4    equ    0        ;1Khz.
  117. k1-3    equ    1h
  118. k1-2    equ    0a3h
  119. k1-1    equ    6fh
  120.  
  121. k10-4    equ    0        ;10Khz.
  122. k10-3    equ    10h
  123. k10-2    equ    62h
  124. k10-1    equ    4eh
  125.  
  126. k100-4    equ    0        ;100Khz.
  127. k100-3    equ    0a3h
  128. k100-2    equ    0d7h
  129. k100-1    equ    0bh
  130.  
  131. mhz-4    equ    06h        ;1Mhz.
  132. mhz-3    equ    66h
  133. mhz-2    equ    66h
  134. mhz-1    equ    67h
  135.  
  136. mhz10-4 equ    40h        ;10 Mhz
  137. mhz10-3 equ    00h
  138. mhz10-2 equ    00h
  139. mhz10-1 equ    00h
  140. ********************************************************************
  141.  
  142.  
  143.  
  144.     org    $0300        ;Start of 68HC705j1A EPROM.
  145.  
  146.  
  147.  
  148. **********************************
  149. * Initialize all one time options.
  150. **********************************
  151. start:    lda    #2        ;Step = 100hz.
  152.     sta    cstep        ;Load current step.
  153.     lda    #$ff        ;Set direction bits for PA0~7.
  154.     sta    ddra        ;make pins PA7-PA0 outputs.
  155.     lda    #$30        ;Set direction bits for PA0~5.
  156.     sta    ddrb        ;Set PA5,4 to output rest to read.
  157.  
  158. ***************************
  159. * Load LCD messages to ram:
  160. ***************************
  161.     clrx            ;clear count/position.
  162. idis:    cpx    #1eh        ;Done printing?
  163.     bhs    eids        ;Branch is count is equal or higher.
  164.     lda    stdis,x        ;Load next character.
  165.     sta    mfreq,x        ;temporarly store accumulator.
  166.     incx            ;Increment count.
  167.     jmp    idis        ;Jump to load char.
  168. eids:    clrx            ;End this routine by falling out.
  169.  
  170. **********************************
  171. * Clear clock lines to data ports.
  172. **********************************
  173.     bclr    5,portb        ;Set DDS Data clk to zero.
  174.     bclr    4,portb        ;Set LCD Data clk to zero.
  175.     bclr    3,portb        ;Set Control Register to zero.
  176.     lda    portb        ;Read initial settings of vfo dial.
  177.     and    #3        ;Isolate bottom 2 bits (VFO bits.)
  178.     sta    first        ;Save result.
  179.     jsr    hz100        ;Load up/dn with 100hz value.
  180.     jsr    m2mb        ;Save it in non-scratch locations.
  181.  
  182.  
  183. **********************
  184. * Initilize Lcd panel:
  185. **********************
  186.     lda    #3h        ;Warm up cold lcd cmd.
  187.     jsr    inst        ;Not sure we have to do this
  188.     jsr    dly50        ;Long delay.
  189.     jsr    inst        ;As no "real" code does it but...
  190.     jsr    dly50        ;It is in the spec.
  191.     jsr    inst        ;Inst is to cmd reg of lcd.
  192.     jsr    dly50        ;More long delays.
  193.     lda    #2h        ;Set it to 4bit data bus 2 line lcd.
  194.     jsr    inst        ;4 bit means one nibble at a time to
  195.     jsr    dly50        ;send each byte.
  196.     jsr    inst
  197.     jsr    dly50
  198.     lda    #8h
  199.     jsr    inst
  200.     jsr    dly50
  201.     lda    #0h        ;Clear the display and
  202.     jsr    inst        ;Home the cursor.
  203.     jsr    dly50
  204.     lda    #1h
  205.     jsr    inst
  206.     jsr    dly50
  207. *******************************
  208. * LCD DISPLAY:
  209. * -----------------------------
  210. * 0 0 0 0 0 0 1 x x x
  211. *        : : :
  212. *        : : Blink 1=on
  213. *        : Cursor 0=off
  214. *        Display 1=on
  215. ********************************
  216.     lda    #0h        ;First nibble display cmd.
  217.     jsr    inst        ;Send 1st nibble.
  218.     jsr    dly50        ;Long delays for initial commands
  219.     lda    #0Ch        ;Display on cursor/blink off.
  220.     jsr    inst        ;Send 2nd nibble.
  221.     jsr    dly50        ;Long delay for initial commands.
  222.     jsr    zero        ;Set to zero and signal DDS.
  223.     jsr    dfreq        ;Display the current frequency.
  224.     jsr    dstep        ;Display the current freq step.
  225.     jmp    switch        ;Jump to read input routine.
  226.  
  227.  
  228.  
  229.  
  230. ********************************************************************
  231. *          S U B R O U T I N E S                   *
  232. ********************************************************************
  233.  
  234. ****************************
  235. * INSTRUCTION:
  236. * Use this routine to write
  237. * command to the LCD.
  238. ****************************
  239. inst:    and    #0FH        ;Clear control bits to lcd.
  240.     jsr    wrtlcd        ;Write to instruction register of LCD port.
  241.     ora    #20h        ;Clk bit (E) on.
  242.     jsr    wrtlcd        ;Now write that.
  243.     and    #0FH        ;Clk bit (E) off.
  244.     jsr    wrtlcd        ;Write this and data is latched in.
  245.     rts            ;Return.
  246.  
  247.  
  248.  
  249. ****************************
  250. * WRITE DATA:
  251. * Use this routine to write
  252. * to the LCD data register.
  253. ****************************
  254. write:    ora    #40H        ;Turn on rs for write cmds.
  255.     jsr    wrtlcd        ;Send to port.
  256.     ora    #20H        ;Clk bit (E) on.
  257.     jsr    wrtlcd        ;Now write that.
  258.     and    #4FH        ;Clk bit (E) off.
  259.     jsr    wrtlcd        ;Write this and data is latched in.
  260.     rts            ;Return.
  261.  
  262.  
  263.  
  264. ********************************
  265. * WRITE TO LCD DATA PORT:
  266. * Take data in accumulator and
  267. * write it to the LCD data port.
  268. ********************************
  269. wrtlcd: jsr    delay        ;Delay before?    Do it to be safe.
  270.     sta    porta        ;Write it to data bus.
  271.     bset    4,portb        ;Set LCD clk high (data is latched.)
  272.     bclr    4,portb        ;Set LCB clk to low.
  273.     jsr    delay        ;Delay between writes to make LCD happy.
  274.     rts            ;Return.
  275.  
  276.  
  277.  
  278. ********************************
  279. * WRITE TO HARRIS DATA PORT:
  280. * Take data in accumulator and
  281. * write it to the DDS data port.
  282. ********************************
  283. wrtdds: sta    porta        ;write it to data bus.
  284.     bset    5,portb        ;Set DDS clk high (data is latched.)
  285.     bclr    5,portb        ;Set DDS clk low.
  286.     rts            ;Return.
  287.  
  288.  
  289.  
  290. ***********************
  291. * HOME LCD TO 1ST LINE:
  292. ***********************
  293. home1:    lda    #8H        ;Home to start of first line.
  294.     jsr    inst        ;Write to cmd register.
  295.     lda    #0H        ;Send the second nibble.
  296.     jsr    inst        ;And write it.
  297.     rts            ;Return.
  298.  
  299.  
  300.  
  301. ***********************
  302. * HOME LCD TO 2ND LINE:
  303. ***********************
  304. home2:    lda    #0CH        ;Home to start of second line.
  305.     jsr    inst        ;Write to cmd register.
  306.     lda    #0h        ;Load second nibble.
  307.     jsr    inst        ;And write it.
  308.     rts            ;Return.
  309.  
  310.  
  311.  
  312. ******************
  313. * Set VFO to zero.
  314. ******************
  315. zero:    lda    #t4        ;Load "zero" to vfo4~1.
  316.     sta    vfo4
  317.     lda    #t3
  318.     sta    vfo3
  319.     lda    #t2
  320.     sta    vfo2
  321.     lda    #t1
  322.     sta    vfo1
  323.     jsr    v2s        ;Save vfo4~1 to scratch MSB/LSB also.
  324.     ldx    #lcnt        ;Load count to shift.
  325.     jsr    shift        ;Shift all data out to Harris.
  326.     rts            ;Return now.
  327.  
  328.  
  329.  
  330. *************************
  331. * Copy VFO4~1 to SCR4~1:
  332. * Actual Freq to scratch.
  333. *************************
  334. v2s:    lda    vfo4
  335.     sta    scr4
  336.     lda    vfo3
  337.     sta    scr3
  338.     lda    vfo2
  339.     sta    scr2
  340.     lda    vfo1
  341.     sta    scr1
  342.     rts
  343.  
  344.  
  345.  
  346. *************************
  347. * Copy SCR4~1 to VFO4~1:
  348. * Scratch to Actual Freq.
  349. *************************
  350. s2v:    lda    scr4
  351.     sta    vfo4
  352.     lda    scr3
  353.     sta    vfo3
  354.     lda    scr2
  355.     sta    vfo2
  356.     lda    scr1
  357.     sta    vfo1
  358.     rts
  359.  
  360.  
  361.  
  362. *************************
  363. * Copy Math4~1 to SCR4~1:
  364. * Copy step to scratch.
  365. *************************
  366. m2s:    lda    math4
  367.     sta    scr4
  368.     lda    math3
  369.     sta    scr3
  370.     lda    math2
  371.     sta    scr2
  372.     lda    math1
  373.     sta    scr1
  374.     rts
  375.  
  376.  
  377.  
  378. ***************************
  379. * Copy Math4~1 to Mathb4~1:
  380. ***************************
  381. m2mb:    lda    math4
  382.     sta    mathb4
  383.     lda    math3
  384.     sta    mathb3
  385.     lda    math2
  386.     sta    mathb2
  387.     lda    math1
  388.     sta    mathb1
  389.     rts
  390.  
  391.  
  392.  
  393. ***************************
  394. * Copy Mathb4~1 to Math4~1:
  395. ***************************
  396. mb2m:    lda    mathb4
  397.     sta    math4
  398.     lda    mathb3
  399.     sta    math3
  400.     lda    mathb2
  401.     sta    math2
  402.     lda    mathb1
  403.     sta    math1
  404.     rts
  405.  
  406.  
  407.  
  408. *************************************
  409. * STUPID BRCLR won't go ver far so...
  410. *************************************
  411. bmp:    jmp    bump        ;Inbetween step to get to real bump routine.
  412.  
  413. *************************
  414. * CLICK VFO UP ONE NOTCH.
  415. *************************
  416. up:    jsr    upurs        ;Add one "step" from VFO.
  417.     jsr    dfreq        ;Update display unit.
  418.     jmp    switch        ;Jump back to switch reading routine.
  419.  
  420. *************************
  421. * CLICK VFO Dn ONE NOTCH.
  422. *************************
  423. dn:    jsr    dnurs        ;Subtract one "step" from VFO.
  424.     jsr    s2v        ;Save it to VFO.
  425.     jsr    shift        ;Need to do the shift also.
  426.     jsr    dfreq        ;Update display unit.
  427.                 ;Fall through to switch routine.
  428. **************************
  429. * READ OPTO SWITCH:
  430. * ACCUM=Scratch
  431. * First=old data from Opto
  432. * X=2nd read of Opto
  433. **************************
  434. switch: brclr    2,portb,bmp    ;Jump if VFO pushed in.
  435.     lda    portb        ;Read switch input pins.
  436.     and    #3        ;Isolate the switch bits.
  437.     tax            ;Move switch info to X register.
  438.     lda    first        ;Load old switch data from last read.
  439.     cmp    #3        ;Was first read a 11b?
  440.     beq    st3        ;Yes?  Then jump.
  441.     cmp    #2        ;Was first read from VFO a 10 binary?
  442.     beq    st2        ;Yes? Then jump.
  443.     cmp    #1        ;Was first read a 01b?
  444.     beq    st1        ;Yes? then jump.
  445. ****************************
  446. * Original sw=0.
  447. * By knowing the values
  448. * of two sucsessive reads
  449. * from the VFO Switch we can
  450. * determine what direction
  451. * (if and) the switch is
  452. * being twisted.
  453. ****************************
  454. st0:    stx    first        ;Save current read to first reg for next time.
  455.     txa            ;Move new read into a.
  456.     cmp    #1        ;Is it an up operation?
  457.     beq    up        ;Jump if so.
  458.     cmp    #2        ;Is is a dn operation?
  459.     beq    dn        ;Jump if it is.
  460.     jmp    switch        ;And go back to switch routine.
  461. ****************
  462. * Original sw=1.
  463. ****************
  464. st1:    stx    first        ;Save current read to first reg for next time.
  465.     txa            ;Move new read into a.
  466.     cmp    #3        ;Is it an up operation?
  467.     beq    up        ;Jump if so.
  468.     cmp    #0        ;Is is a dn operation?
  469.     beq    dn        ;Jump if it is.
  470.     jmp    switch
  471. ****************
  472. * Original sw=2.
  473. ****************
  474. st2:    stx    first        ;Save current read to first reg for next time.
  475.     txa            ;Move new read into a.
  476.     cmp    #0        ;Is it an up operation?
  477.     beq    up        ;Jump if so.
  478.     cmp    #3        ;Is is a dn operation?
  479.     beq    dn        ;Jump if it is.
  480.     jmp    switch
  481. ****************
  482. * Original sw=3.
  483. ****************
  484. st3:    stx    first        ;Save current read to first reg for next time.
  485.     txa            ;Move new read into a.
  486.     cmp    #2        ;Is it an up operation?
  487.     beq    up        ;Jump if so.
  488.     cmp    #1        ;Is is a dn operation?
  489.     beq    dn        ;Jump if it is.
  490.     jmp    switch
  491.  
  492.  
  493.  
  494. ***********************
  495. * DOWN YOURS:
  496. * Decrease output freq.
  497. * A simple 32Bit sub.
  498. * SCR=SCR-MATH
  499. ***********************
  500. dnurs:    lda    scr1        ;Get scr1 of current VFO frequency.
  501.     sub    math1        ;Add lsbs together without carry.
  502.     sta    scr1        ;Save result.
  503.     lda    scr2        ;Get scr2 of current VFO frequency.
  504.     sbc    math2        ;Add with carry from 1st addition.
  505.     sta    scr2        ;Save new result.
  506.     lda    scr3        ;Get scr3 of current VFO frequency.
  507.     sbc    math3        ;Add with carry from 2nd addition.
  508.     sta    scr3        ;Save new result.
  509.     lda    scr4        ;Get scr4 of current VFO frequency.
  510.     sbc    math4        ;Add with carry from 3rd addition.
  511.     sta    scr4        ;save last result!
  512.     ldx    #lcnt        ;Load x with amount to shift.
  513.     rts            ;Return.
  514. ***********************
  515. * UP YOURS:
  516. * Increase output freq.
  517. * A simple 32Bit add.
  518. * SCR=SCR+MATH
  519. ***********************
  520. upurs:    lda    scr1        ;Get scr1 of current VFO frequency.
  521.     add    math1        ;Add lsbs together without carry.
  522.     sta    scr1        ;Save result.
  523.     lda    scr2        ;Get scr2 of current VFO frequency.
  524.     adc    math2        ;Add with carry from 1st addition.
  525.     sta    scr2        ;Save new result.
  526.     lda    scr3        ;Get scr3 of current VFO frequency.
  527.     adc    math3        ;Add with carry from 2nd addition.
  528.     sta    scr3        ;Save new result.
  529.     lda    scr4        ;Get scr4 of current VFO frequency.
  530.     adc    math4        ;Add with carry from 3rd addition.
  531.     sta    scr4        ;save last result!
  532.     ldx    #lcnt        ;Load amount to shift.
  533.     jsr    s2v
  534. ****************************************
  535. * SHIFT 32 BIT DATA:
  536. * SCR Contains the 32 bit cmd
  537. * that shall be written to the I/O port.
  538. * Shift left shifts the 32 long into
  539. * the HARRIS NCO (or DDS) Chip.
  540. ****************************************
  541. shift:    lda    scr1        ;Load A with LSB of data to shift out.
  542.     add    scr1        ;Add it to itself (Carry is M.S.Bit)
  543.     sta    scr1        ;Save new result.
  544.     lda    scr2        ;Load next byte.
  545.     adc    scr2        ;add with carry from 1st add.
  546.     sta    scr2        ;And so on....
  547.     lda    scr3        ;on
  548.     adc    scr3        ;and on
  549.     sta    scr3        ;and
  550.     lda    scr4        ;on
  551.     adc    scr4        ;and on
  552.     sta    scr4        ;and
  553.     lda    #idle        ;on.
  554.     bcs    da1        ;If carry set we need to send a 1 to dds.
  555. back:    jsr    wrtdds        ;Write to Harris DDS chip.
  556.     ora    #clk        ;Turn on clk bit now.
  557.     jsr    wrtdds        ;Write it (clocking in valid data bit.)
  558.     lda    #idle        ;Load idle command again!
  559.     jsr    wrtdds        ;Write idle to Harris DDS.
  560.     decx            ;Decrement shift count.
  561.     bne    shift        ;Loop until all 32 data bits are sent.
  562.     jmp    xferit        ;Data send now signal transfer complete.
  563. ***************************
  564. * Change data bit to a one.
  565. ***************************
  566. da1:    lda    #dat1        ;Change data bit to a 1 (not zero.)
  567.     jmp    back        ;Keep going.  Gotta finish all those bits.
  568. ***********************************
  569. * TRANSFER:
  570. * This routine signals the DDS that
  571. * a 32 bit command is complete.
  572. ***********************************
  573. xferit: lda    #xfer        ;Load Idle command.
  574.     jsr    wrtdds        ;Write it to DDS port.
  575. ******************
  576. * IDLE Harris DDS.
  577. ******************
  578. idleit: lda    #idle        ;Load Idle again.
  579.     jsr    wrtdds        ;And write it to the DDS port.
  580.     jsr    v2s        ;Restore scratch (shifted) locations.
  581.     rts            ;Return to caller.
  582.  
  583.  
  584.  
  585. *******************************
  586. * 32 Bit division routine:    *
  587. *******************************
  588. *       Answer          *
  589. *     __________          *
  590. * Divisor) Dividend          *
  591. *                  *
  592. *******************************
  593. * Divide two 32 Bit integers. *
  594. * Answer in ans              *
  595. * Remainder in MATH(4~1)      *
  596. *******************************
  597. div32:    clr    ans        ;Clear answer register.
  598. divb:    clrx            ;Clear count each time through.
  599.     lda    scr1        ;Get scr1 of current VFO frequency.
  600.     sub    math1        ;Add lsbs together without carry.
  601.     sta    scr1        ;Save result.
  602.     lda    scr2        ;Get scr2 of current VFO frequency.
  603.     sbc    math2        ;Add with carry from 1st addition.
  604.     sta    scr2        ;Save new result.
  605.     lda    scr3        ;Get scr3 of current VFO frequency.
  606.     sbc    math3        ;Add with carry from 2nd addition.
  607.     sta    scr3        ;Save new result.
  608.     lda    scr4        ;Get scr4 of current VFO frequency.
  609.     sbc    math4        ;Add with carry from 3rd addition.
  610.     sta    scr4        ;save last result!
  611.     bcs    fixit        ;Oops divided by one too many!
  612.     inc    ans        ;X = answer.
  613.     jmp    divb        ;Keep on dividing.
  614. ***********************
  615. * Add back over divide.
  616. ***********************
  617. fixit:    lda    scr1        ;Get scr1 of current VFO frequency.
  618.     add    math1        ;Add lsbs together without carry.
  619.     sta    scr1        ;Save result.
  620.     lda    scr2        ;Get scr2 of current VFO frequency.
  621.     adc    math2        ;Add with carry from 1st addition.
  622.     sta    scr2        ;Save new result.
  623.     lda    scr3        ;Get scr3 of current VFO frequency.
  624.     adc    math3        ;Add with carry from 2nd addition.
  625.     sta    scr3        ;Save new result.
  626.     lda    scr4        ;Get scr4 of current VFO frequency.
  627.     adc    math4        ;Add with carry from 3rd addition.
  628.     sta    scr4        ;save last result!
  629.     lda    ans        ;Get Binary answer.
  630.     add    #30        ;Convert to ASCII "number."
  631.     rts            ;Return to caller.
  632.  
  633.  
  634. *****************************
  635. * Change the steps to 10 Mhz.
  636. *****************************
  637. mhz10:    lda    #mhz10-4    ;Load 10 Mhz values.
  638.     sta    math4
  639.     lda    #mhz10-3
  640.     sta    math3
  641.     lda    #mhz10-2
  642.     sta    math2
  643.     lda    #mhz10-1
  644.     sta    math1
  645.     rts
  646.  
  647. ****************************
  648. * Change the steps to 1 MHZ.
  649. ****************************
  650. mhz:    lda    #mhz-4        ;Load 1 MHz values.
  651.     sta    math4
  652.     lda    #mhz-3
  653.     sta    math3
  654.     lda    #mhz-2
  655.     sta    math2
  656.     lda    #mhz-1
  657.     sta    math1
  658.     rts
  659.  
  660. ******************************
  661. * Change the steps to 100 KHz.
  662. ******************************
  663. khz100: lda    #k100-4         ;Load 100kHz values.
  664.     sta    math4
  665.     lda    #k100-3
  666.     sta    math3
  667.     lda    #k100-2
  668.     sta    math2
  669.     lda    #k100-1
  670.     sta    math1
  671.     rts
  672.  
  673. *****************************
  674. * Change the steps to 10 KHz.
  675. *****************************
  676. khz10:    lda    #k10-4        ;Load 10kHz values.
  677.     sta    math4
  678.     lda    #k10-3
  679.     sta    math3
  680.     lda    #k10-2
  681.     sta    math2
  682.     lda    #k10-1
  683.     sta    math1
  684.     rts
  685.  
  686. ****************************
  687. * Change the steps to 1 KHz.
  688. ****************************
  689. khz1:    lda    #k1-4           ;Load 1kHz values.
  690.     sta    math4
  691.     lda    #k1-3
  692.     sta    math3
  693.     lda    #k1-2
  694.     sta    math2
  695.     lda    #k1-1
  696.     sta    math1
  697.     rts
  698.  
  699. *********************************
  700. * Change the steps to 100 cycles.
  701. *********************************
  702. hz100:    lda    #h100-4        ;Load 100Hz values.
  703.     sta    math4
  704.     lda    #h100-3
  705.     sta    math3
  706.     lda    #h100-2
  707.     sta    math2
  708.     lda    #h100-1
  709.     sta    math1
  710.     rts
  711.  
  712. *******************************
  713. * Change the math to 10 cycles.
  714. *******************************
  715. hz10:    lda    #h10-4           ;Load 10Hz values.
  716.     sta    math4
  717.     lda    #h10-3
  718.     sta    math3
  719.     lda    #h10-2
  720.     sta    math2
  721.     lda    #h10-1
  722.     sta    math1
  723.     rts
  724.  
  725. *****************************
  726. * Change the math to 1 cycle.
  727. *****************************
  728. hz1:    lda    #h1-4           ;Load 1Hz values.
  729.     sta    math4
  730.     lda    #h1-3
  731.     sta    math3
  732.     lda    #h1-2
  733.     sta    math2
  734.     lda    #h1-1
  735.     sta    math1
  736.     rts
  737.  
  738.  
  739.  
  740. ***************************
  741. * DISPLAY:
  742. * Display current frequency
  743. ***************************
  744. dfreq:    jsr    home1        ;Home to start of line one of LCD.
  745.     jsr    m2mb        ;Save scratch math to mathb.
  746.     jsr    sbase        ;Subtract base freq (5.05MHz typical)
  747.  
  748.     jsr    mhz10        ;Load 10Mhz values to math.
  749.     jsr    div32        ;Returns ascii answer in accumulator.
  750. ;    sta    mfreq+5        ;Rem out for vfo.  Use in Signal generator.
  751.     jsr    mhz        ;Load 1MHz values to math.
  752.     jsr    div32        ;Returns ascii answer in accumulator.
  753. ;    sta    mfreq+6        ;Rem out because we don't want to display mhz.
  754.  
  755.     jsr    khz100
  756.     jsr    div32
  757.     sta    mfreq+8
  758.     jsr    khz10
  759.     jsr    div32
  760.     sta    mfreq+9
  761.     jsr    khz1
  762.     jsr    div32
  763.     sta    mfreq+0Ah
  764.     jsr    hz100
  765.     jsr    div32
  766.     sta    mfreq+0Ch
  767.     jsr    hz10
  768.     jsr    div32
  769.     sta    mfreq+0DH
  770.     jsr    hz1
  771.     jsr    div32
  772.     sta    mfreq+0EH    ;Store in hertz ascii digit.
  773.     jsr    mb2m        ;Restore scratch steps.
  774.     clrx            ;Clear offset.
  775. *******************************
  776. * Print FREQ:XX.xxx.xxx to LCD.
  777. *******************************
  778.     jsr    home1        ;put cursor at start of 1st line.
  779. ldchar: cpx    #0FH        ;Done printing?
  780.     bhs    efreq        ;Branch is count is equal or higher.
  781.     lda    mfreq,x        ;Load next character.
  782.     sta    tempa        ;temporarly store accumulator.
  783.     clc            ;clear carry bit.
  784.     and    #0F0H        ;use only top nibble.
  785.     rora            ;Right shift top nibble to bottom.
  786.     rora
  787.     rora
  788.     rora
  789.     jsr    write        ;Else write nibble to LCD panel.
  790.     lda    tempa        ;Reread stored accumulator.
  791.     and    #0FH        ;Clear out the top nibble.
  792.     jsr    write
  793.     incx            ;Increment count.
  794.     jmp    ldchar        ;Jump to load char.
  795. efreq:    jsr    v2s        ;Reload scratch from current VFO.
  796.     rts            ;End this routine and return.
  797. **************************
  798. * SUBTRACT BASE FREQUENCY.
  799. * Subtract the zero freq
  800. * from the scratch regs
  801. * for display purposes.
  802. **************************
  803. sbase:    lda    #t4        ;Load "zero" to vfo4~1.
  804.     sta    math4
  805.     lda    #t3
  806.     sta    math3
  807.     lda    #t2
  808.     sta    math2
  809.     lda    #t1
  810.     sta    math1
  811.     jsr    dnurs        ;32Bit subtract.
  812.     jsr    mb2m        ;Restore scratch math.
  813.     rts
  814.  
  815.  
  816.  
  817. *****************************
  818. * Store step to mem in ascii.
  819. *****************************
  820. dstep:    jsr    home2        ;Home to start of second line of LCD panel.
  821.     jsr    m2mb        ;Save scratch math to mathb.
  822.     jsr    m2s        ;Load current step to scratch.
  823.     jsr    khz100        ;Load 100Khz to math.
  824.     jsr    div32        ;Now tell us how many are in scratch.
  825.     sta    mstep+5        ;Shove ASCII ans to display location.
  826.     jsr    khz10        ;Load 10Khz to math.
  827.     jsr    div32        ;Now tell us how many are in scratch.
  828.     sta    mstep+6        ;Shove ASCII asn to display location.
  829.     jsr    khz1        ;Load 1Khz to math.
  830.     jsr    div32        ;Now tell us how many are in scratch.
  831.     sta    mstep+7        ;Shove it into the temp display location.
  832.     jsr    hz100        ;Load 100hz to math.
  833.     jsr    div32        ;Now tell us how many are in scratch.
  834.     sta    mstep+9        ;Shove it into the temp display location.
  835.     jsr    hz10        ;Load 10hz to math.
  836.     jsr    div32        ;Now tell us how many are in scratch.
  837.     sta    mstep+0AH    ;Shove it into the temp display location.
  838.     jsr    hz1        ;Load 1hz to math.
  839.     jsr    div32        ;Now tell us how many are in scratch.
  840.     sta    mstep+0BH    ;Shove it into the temp display location.
  841.     jsr    v2s        ;Restore scratch.
  842.     jsr    mb2m        ;Restore scratch steps.
  843.     clrx            ;Clear offset.
  844. ****************************
  845. * Print STEP:XXX.XXX to LCD.
  846. ****************************
  847.     jsr    home2        ;Put cursor at start of line #2.
  848. ldc2:    cpx    #0fH        ;Done printing?
  849.     bhs    efq2        ;Branch is count is equal or higher.
  850.     lda    mstep,x        ;Load next character.
  851.     sta    tempa        ;temporarly store accumulator.
  852.     clc            ;clear carry bit.
  853.     and    #0F0H        ;use only top nibble.
  854.     rora            ;Right shift top nibble to bottom.
  855.     rora
  856.     rora
  857.     rora
  858.     jsr    write        ;Else write nibble to LCD panel.
  859.     lda    tempa        ;Reread stored accumulator.
  860.     and    #0FH        ;Clear out the top nibble.
  861.     jsr    write        ;Else write nibble to LCD panel.
  862.     incx            ;Increment count.
  863.     jmp    ldc2        ;Jump to load char.
  864. efq2:    jsr    v2s        ;Restore scratch from current VFO.
  865.     rts            ;End this routine and return.
  866.  
  867.  
  868.  
  869. *******************
  870. * DELAY 1/4 second.
  871. *******************
  872. dly250:
  873.     sta    tempa
  874.     stx    tempx
  875.     lda    #5        ;5 times 50ms!
  876. lp5:    jsr    dly50        ;use the 50ms loop.
  877.     deca
  878.     bne    lp5
  879.     lda    tempa
  880.     ldx    tempx
  881.     rts
  882.  
  883. **************
  884. * DELAY 50 ms.
  885. **************
  886. dly50:
  887.     sta    tempa        ;Save accumulator.
  888.     stx    tempx        ;Save X.
  889.     lda    #32        ;32=50ms ff=250ms
  890. olp:    clrx
  891. ilp:    decx
  892.     bne    ilp
  893.     deca
  894.     bne    olp
  895.     lda    tempa        ;Restore accumulator.
  896.     ldx    tempx        ;Restore X.
  897.     rts
  898.  
  899. *************************
  900. * DELAY:
  901. * Routine to delay 1.5ms.
  902. *************************
  903. delay:
  904.     stx    tempx        ;Save x register.
  905.     clrx            ;X is used as the inner loop count.
  906.     ldx    #20H        ;Short delay count.
  907. inrlp:    decx            ;0~ff, FF!fe,...1~0 256 loops.
  908.     bne    inrlp        ;6cyc*256*500ns/cyc=0.768ms
  909.     ldx    tempx        ;Restore x resiter.
  910.     rts
  911.  
  912.  
  913.  
  914. **************************
  915. * BUMP TUNING STEPS.
  916. * User has pressed the VFO
  917. * Knob in and this routine
  918. * responds by changing the
  919. * current step.
  920. **************************
  921. bump:    sta    tempa
  922.     lda    cstep        ;Load current step.
  923.     cmp    #0        ;If 1hz
  924.     beq    s10        ;then goto 10hz steps.
  925.     cmp    #1        ;If 10hz
  926.     beq    s100        ;then goto 100Hz steps.
  927.     cmp    #2        ;If 100hz
  928.     beq    s1k        ;then goto 1KHz steps.
  929.     cmp    #3        ;If 1Khz
  930.     beq    s10k        ;Then go to 10KHz steps.
  931.     cmp    #4        ;If 10Khz
  932.     beq    s100k        ;then go to 1hz steps.
  933.     cmp    #5
  934.     beq    s1
  935.     lda    tempa
  936.     jmp    switch
  937. ************
  938. * STEP 1 Hz.
  939. ************
  940. s1:    lda    #0
  941.     sta    cstep
  942.     jsr    hz1
  943.     jsr    dstep
  944.     jsr    dly250
  945.     jmp    switch
  946. ************
  947. * STEP 10Hz.
  948. ************
  949. s10:    lda    #1
  950.     sta    cstep
  951.     jsr    hz10
  952.     jsr    dstep
  953.     jsr    dly250
  954.     jmp    switch
  955. *************
  956. * STEP 100Hz.
  957. *************
  958. s100:    lda    #2
  959.     sta    cstep
  960.     jsr    hz100
  961.     jsr    dstep
  962.     jsr    dly250
  963.     jmp    switch
  964. ************
  965. * STEP 1KHz.
  966. ************
  967. s1k:    lda    #3
  968.     sta    cstep
  969.     jsr    khz1
  970.     jsr    dstep
  971.     jsr    dly250
  972.     jmp    switch
  973. *************
  974. * STEP 10KHz.
  975. *************
  976. s10k:    lda    #4
  977.     sta    cstep
  978.     jsr    khz10
  979.     jsr    dstep
  980.     jsr    dly250
  981.     jmp    switch
  982. **************
  983. * STEP 100KHz.
  984. **************
  985. s100k:    lda    #5
  986.     sta    cstep
  987.     jsr    khz100
  988.     jsr    dstep
  989.     jsr    dly250
  990.     jmp    switch
  991. ************
  992. * STEP 1MHz.
  993. ************
  994. s1mhz:    lda    #6
  995.     sta    cstep
  996.     jsr    mhz
  997.     jsr    dstep
  998.     jsr    dly250
  999.     jmp    switch
  1000.  
  1001.  
  1002.  
  1003. stdis:    db    'FREQ:xx.xxx.xxxSTEP:XXX.XXX hz'
  1004.  
  1005. last:    db    ' '
  1006.  
  1007. tim_vec:jmp    start
  1008.  
  1009. int_vec:jmp    start
  1010.  
  1011.  
  1012.  
  1013.  
  1014.  
  1015. ***************
  1016. * VECTOR SPACE.
  1017. ***************
  1018.  
  1019.  
  1020.     org    $7F8        ;Start of Reset/Interrupt vectors.
  1021.  
  1022.  
  1023.  
  1024.  
  1025.     dw    tim_vec        ;If timer ints were enabled it would go here.
  1026.     dw    int_vec        ;If IRQ was unmasked it would go here.
  1027.     dw    start        ;So 6805 knows where to start on pwr up.
  1028.     dw    start        ;So 6805 knows where to go on reset.
  1029.  
  1030.  
  1031.  
  1032.     end            ;NUFF SAID!
  1033.